'''
递归：
    1.递归的本质是：
        1.1 函数内部自己调用自己。
        函数的调用过程是一个压栈的过程。
        函数的返回过程是一个出栈的过程。
        1.2 递归的本质是：将一个复杂的问题，分解成一个简单的问题。
    2.递归的条件：
        2.1 必须要有一个明确的结束条件。
        2.2 每次进入更深一层递归时，问题规模相比上次递归都应有所减少。
    3.递归的优点：
        3.1 代码简洁，可读性强。
    4.递归的缺点：
        4.1 递归调用函数，系统需要为每一层的返回点、局部变量等开辟栈来存储。
        4.2 递归中重复计算，浪费空间。
    5.递归的应用场景：
        5.1 树形结构的遍历。
        5.2 图的遍历。
        5.3 分治算法。
        5.4 回溯算法。
        5.5 动态规划。
    6.递归的注意事项：
        6.1 递归调用的次数过多，会导致栈溢出。
        6.2 递归调用的次数过多，会导致程序崩溃  
'''
#递归求阶乘
'''
    1.递归求阶乘的公式：n! = n * (n-1)!
    2.递归求阶乘的条件：
        2.1 必须要有一个明确的结束条件。
        2.2 每次进入更深一层递归时，问题规模相比上次递归都应有所减少。
'''
#用普通的函数求阶乘
def factorial0(n):#n是阶乘的数
    result = 1 #定义一个变量，用来存储阶乘的结果
    for i in range(1,n+1): #循环n次，从1到n
        result *= i #result = result * i
    return result #返回result

print(factorial0(5)) #120
print(factorial0(10)) #3628800
print("*"*20)

#用递归求阶乘
def factorial(n):#n是阶乘的数
    if n == 1: #结束条件
        return 1 #返回1
    else: #递归条件
        return n * factorial(n-1) #返回n*factorial(n-1)
    
#2.调用函数
print(factorial(5)) #120
print(factorial(10)) #3628800